package mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import mpo.Dyrektor;
import mpo.Kategoria;
import mpo.Klient;
import mpo.Ksiegowa;
import mpo.Pracownik;
import mpo.Premia;
import mpo.Sprzet;
import mpo.StatusZlecenia;
import mpo.User;
import mpo.Utility;
import mpo.Zlecenie;

public class Db_Mysql_write {

    public static int zapiszPracownikaDoBazy(Connection con, Pracownik pracownikDoZapisu) {
        User u = new User(pracownikDoZapisu.getPesel(), pracownikDoZapisu.getHaslo(),
                pracownikDoZapisu.getLogin(), pracownikDoZapisu.getImie(), pracownikDoZapisu.getNazwisko(),
                pracownikDoZapisu.getNIP(), pracownikDoZapisu.getTelefon(), pracownikDoZapisu.getAdres(), pracownikDoZapisu.getdataWygasnieciaUmowyViaString(), pracownikDoZapisu.getIdZlecenia());
        int kodBledu = zapiszUseraDoBazy(con, u);
        if (kodBledu != 0) {
            System.out.println("NIE Udal sie zapis usera");
            return kodBledu;
        }

        System.out.println("Udal sie zapis usera");

        try {
            String query = " insert into Pracownik(pesel,rodzajUmowy,idZespol)"
                    + " values (?, ?, ?)";

            PreparedStatement preparedStmt = con.prepareStatement(query);
            preparedStmt.setString(1, pracownikDoZapisu.getPesel());
            preparedStmt.setString(2, pracownikDoZapisu.getRodzajUmowy());
            preparedStmt.setInt(3, pracownikDoZapisu.getIdZespol());

            preparedStmt.execute();

        } catch (Exception e) {
            System.err.println("Got an exception!");
            System.err.println(e.getMessage());
            return 1;   //1 w przypadku niepowodzenia
        }
        System.out.println("Udal sie zapis pracownika");
        return 0;   // 0  w przypadku powodzenia

    }

    public static int zapiszKiegowaDoBazy(Connection con, Ksiegowa ksiegowaDoZapisu) {

        User u = new User(ksiegowaDoZapisu.getPesel(), ksiegowaDoZapisu.getHaslo(),
                ksiegowaDoZapisu.getLogin(), ksiegowaDoZapisu.getImie(), ksiegowaDoZapisu.getNazwisko(),
                ksiegowaDoZapisu.getNIP(), ksiegowaDoZapisu.getTelefon(), ksiegowaDoZapisu.getAdres(), ksiegowaDoZapisu.getdataWygasnieciaUmowyViaString(), 1);

        int kodBledu = zapiszUseraDoBazy(con, u);
        if (kodBledu != 0) {
            System.out.println("NIE Udal sie zapis usera");
            return kodBledu;
        }

        System.out.println("Udal sie zapis usera");
        try {
            String query = " insert into Ksiegowa(pesel,certyfikat,szkolenia,uprawnienia)"
                    + " values (?, ?, ?, ?)";
            PreparedStatement preparedStmt = con.prepareStatement(query);
            preparedStmt.setString(1, ksiegowaDoZapisu.getPesel());
            preparedStmt.setString(2, ksiegowaDoZapisu.getCertyfikat());
            preparedStmt.setString(3, ksiegowaDoZapisu.getSzkolenia());
            preparedStmt.setString(4, ksiegowaDoZapisu.getUprawnienia());
            preparedStmt.execute();
        } catch (Exception e) {
            System.err.println("Got an exception!");
            System.err.println(e.getMessage());
            return 1;                           //1 w przypadku niepowodzenia
        }
        System.out.println("Udal sie zapis ksiegowej");
        return 0;   // 0  w przypadku powodzenia

    }

    public static int zapiszDyrektoraDoBazy(Connection con, Dyrektor dyrektorDoZapisu) {
        User u = new User(dyrektorDoZapisu.getPesel(), dyrektorDoZapisu.getHaslo(),
                dyrektorDoZapisu.getLogin(), dyrektorDoZapisu.getImie(), dyrektorDoZapisu.getNazwisko(),
                dyrektorDoZapisu.getNIP(), dyrektorDoZapisu.getTelefon(), dyrektorDoZapisu.getAdres(), dyrektorDoZapisu.getdataWygasnieciaUmowyViaString(), 1);

        int kodBledu = zapiszUseraDoBazy(con, u);
        if (kodBledu != 0) {
            System.out.println("NIE Udal sie zapis usera");
            return kodBledu;
        }

        System.out.println("Udal sie zapis usera");
        try {
            String query = " insert into Dyrektor(pesel,stanowisko,obowiazki,wyksztalcenie)"
                    + " values (?, ?, ?, ?)";
            PreparedStatement preparedStmt = con.prepareStatement(query);
            preparedStmt.setString(1, dyrektorDoZapisu.getPesel());
            preparedStmt.setString(2, dyrektorDoZapisu.getStanowisko());
            preparedStmt.setString(3, dyrektorDoZapisu.getObowiazki());
            preparedStmt.setString(4, dyrektorDoZapisu.getWyksztalcenie());

            preparedStmt.execute();
        } catch (Exception e) {
            System.err.println("Got an exception!");
            System.err.println(e.getMessage());
            return 1;                           //1 w przypadku niepowodzenia
        }
        return 0;   // 0  w przypadku powodzenia
    }

    public static int zapiszUseraDoBazy(Connection con, User userDoZapisu) {

        try {

            String query = " insert into User (pesel, haslo, login, imie, nazwisko, NIP, telefon, adres, dataWygasnieciaUmowy)"
                    + " values (?, ?, ?, ?, ?, ?, ?, ?, ?)";

            PreparedStatement preparedStmt = con.prepareStatement(query);
            preparedStmt.setString(1, userDoZapisu.getPesel());
            preparedStmt.setString(2, Utility.toSHA1(userDoZapisu.getHaslo().getBytes()));
            preparedStmt.setString(3, userDoZapisu.getLogin());
            preparedStmt.setString(4, userDoZapisu.getImie());
            preparedStmt.setString(5, userDoZapisu.getNazwisko());
            preparedStmt.setString(6, userDoZapisu.getNIP());
            preparedStmt.setString(7, userDoZapisu.getTelefon());
            preparedStmt.setString(8, userDoZapisu.getAdres());
            preparedStmt.setString(9, userDoZapisu.getDataWygasnieciaUmowyViaString());

            preparedStmt.execute();

        } catch (Exception e) {
            System.err.println("Got an exception!");
            System.err.println(e.getMessage());
            return 1;                           //1 w przypadku niepowodzenia
        }
        return 0;   // 0  w przypadku powodzenia
    }

    public static int zapiszKlientaDoBazy(Connection con, Klient klientDoZapisu) {

        klientDoZapisu.setId(okreslIdKlient(con));

        try {

            String query = " insert into Klient(id, imie, nazwisko, nazwa, miasto, telefon, typKlienta)"
                    + " values (?, ?, ?, ?, ?, ?, ?)";

            PreparedStatement preparedStmt = con.prepareStatement(query);
            preparedStmt.setInt(1, klientDoZapisu.getId());
            preparedStmt.setString(2, klientDoZapisu.getImie());
            preparedStmt.setString(3, klientDoZapisu.getNazwisko());
            preparedStmt.setString(4, klientDoZapisu.getNazwa());
            preparedStmt.setString(5, klientDoZapisu.getMiasto());
            preparedStmt.setString(6, klientDoZapisu.getTelefon());
            preparedStmt.setString(7, klientDoZapisu.getTypKlienta());

            preparedStmt.execute();

        } catch (Exception e) {
            System.err.println("Got an exception!");
            System.err.println(e.getMessage());
            return 1;                           //1 w przypadku niepowodzenia
        }
        return 0;   // 0  w przypadku powodzenia

    }

    public static int zapiszKategoriaDoBazy(Connection con, Kategoria kategoriaDoZapisu) { //PUBLIC !
        //test pesela czy canBe

        if (!Utility.canBeAPesel(kategoriaDoZapisu.getOwnerPesel())) {
            System.out.println("Blad w zapisie kategorii: niepoprawny pesel wlasciciela wpisu");
            return 2;
        }

        //tu 2gi test na obecnosc pesela w tabeli pracownik moze byc
        //...
        //ustalenie id
        kategoriaDoZapisu.setId(okreslIdNowejKategorii(con));

        try {

            String query = " insert into Kategoria(id,nazwa,dataWaznosci,pesel)"
                    + " values (?, ?, ?, ?)";

            PreparedStatement preparedStmt = con.prepareStatement(query);
            preparedStmt.setInt(1, kategoriaDoZapisu.getId());
            preparedStmt.setString(2, kategoriaDoZapisu.getNazwa());
            preparedStmt.setString(3, kategoriaDoZapisu.getDataWaznosciViaString());
            preparedStmt.setString(4, kategoriaDoZapisu.getOwnerPesel());

            preparedStmt.execute();

            System.out.println("zapis kategori wyglada na poprawnie przeprowadzony");
        } catch (Exception e) {
            System.err.println("Got an exception!");
            System.err.println(e.getMessage());
            return 1;                           //1 w przypadku niepowodzenia
        }
        return 0;   // 0  w przypadku powodzenia
    }

    public static int zapiszSprzetDoBazy(Connection con, Sprzet sprzetDoZapisu) {

        if (!Utility.canBeAPesel(sprzetDoZapisu.getPeselZglaszajacego())) {
            System.out.println("Blad w zapisie sprzetu: niepoprawny pesel wlasciciela wpisu");
            return 2;
        }
        try {

            String query = " insert into Sprzet(id, nazwa, ilosc, opis, stanZgloszenia, stanNaprawy, pesel)"
                    + " values (?, ?, ?, ?, ?, ?, ?)";
            sprzetDoZapisu.setId(okreslIdNowejAwarii(con));

            PreparedStatement preparedStmt = con.prepareStatement(query);
            preparedStmt.setInt(1, sprzetDoZapisu.getId());
            preparedStmt.setString(2, sprzetDoZapisu.getNazwa());
            preparedStmt.setInt(3, sprzetDoZapisu.getIlosc());
            preparedStmt.setString(4, sprzetDoZapisu.getOpis());
            preparedStmt.setString(5, sprzetDoZapisu.getStanZgloszenia());
            preparedStmt.setString(6, sprzetDoZapisu.getStanNaprawy());
            preparedStmt.setString(7, sprzetDoZapisu.getPeselZglaszajacego());

            preparedStmt.execute();

            System.out.println("zapis sprzetu wyglada na poprawnie przeprowadzony");
        } catch (Exception e) {
            System.err.println("Got an exception!");
            System.err.println(e.getMessage());
            return 1;                           //1 w przypadku niepowodzenia
        }
        return 0;   // 0  w przypadku powodzenia
    }

    static private int okreslIdNowejAwarii(Connection con) {
        int maxId = 0;
        try {

            String query = "SELECT MAX(id) as maxid FROM Sprzet ";
            PreparedStatement preparedStmt = con.prepareStatement(query);
            ResultSet rs = preparedStmt.executeQuery();
            while (rs.next()) {
                maxId = rs.getInt("maxid");

            }
            return maxId + 1;
        } catch (Exception e) {
            return -1;    //blad
        }
    }

    static private int okreslIdNowejKategorii(Connection con) {
        int maxId = 0;
        try {

            String query = "SELECT MAX(id) as maxid FROM Kategoria";
            PreparedStatement preparedStmt = con.prepareStatement(query);
            ResultSet rs = preparedStmt.executeQuery();
            while (rs.next()) {
                maxId = rs.getInt("maxid");

            }

            return maxId + 1;
        } catch (Exception e) {
            System.err.println(e);
            return -1;    //blad
        }
    }

    static private int okreslIdStatusuZlecenia(Connection con) {
        int maxId = 0;
        try {

            String query = "SELECT MAX(id) as maxid FROM StatusZlecenia";
            PreparedStatement preparedStmt = con.prepareStatement(query);
            ResultSet rs = preparedStmt.executeQuery();
            while (rs.next()) {
                maxId = rs.getInt("maxid");

            }

            return maxId + 1;
        } catch (Exception e) {
            System.err.println(e);
            return -1;    //blad
        }
    }

    static private int okreslIdPremia(Connection con) {
        int maxId = 0;
        try {

            String query = "SELECT MAX(id) as maxid FROM Premia";
            PreparedStatement preparedStmt = con.prepareStatement(query);
            ResultSet rs = preparedStmt.executeQuery();
            while (rs.next()) {
                maxId = rs.getInt("maxid");

            }

            return maxId + 1;
        } catch (Exception e) {
            System.err.println(e);
            return -1;    //blad
        }
    }

    static private int okreslIdKlient(Connection con) {
        int maxId = 0;
        try {

            String query = "SELECT MAX(id) as maxid FROM Klient";
            PreparedStatement preparedStmt = con.prepareStatement(query);
            ResultSet rs = preparedStmt.executeQuery();
            while (rs.next()) {
                maxId = rs.getInt("maxid");

            }

            return maxId + 1;
        } catch (Exception e) {
            System.err.println(e);
            return -1;    //blad
        }
    }

    static private int okreslIdZlecenia(Connection con) {
        int maxId = 0;
        try {

            String query = "SELECT MAX(id) as maxid FROM Zlecenie ";
            PreparedStatement preparedStmt = con.prepareStatement(query);
            ResultSet rs = preparedStmt.executeQuery();
            while (rs.next()) {
                maxId = rs.getInt("maxid");

            }
            return maxId + 1;
        } catch (Exception e) {
            return -1;    //blad
        }
    }

    public static int zapiszStatusZleceniaDoBazy(Connection con, StatusZlecenia status) {

        try {

            String query = " insert into StatusZlecenia(id, dataWpisu, opis, statusZlecenia, idZlecenie)"
                    + " values (?, ?, ?, ?, ?)";
            status.setId(okreslIdStatusuZlecenia(con));

            PreparedStatement preparedStmt = con.prepareStatement(query);
            preparedStmt.setInt(1, status.getId());
            preparedStmt.setString(2, status.getDataWpisuViaString());
            preparedStmt.setString(3, status.getOpis());
            preparedStmt.setString(4, status.getStatusZlecenia());
            preparedStmt.setInt(5, status.getIdZlecenie());

            preparedStmt.execute();

            System.out.println("zapis Statusu Zlecenia wyglada na poprawnie przeprowadzony");
        } catch (Exception e) {
            System.err.println("Got an exception!");
            System.err.println(e.getMessage());
            return 1;                           //1 w przypadku niepowodzenia
        }
        return 0;   // 0  w przypadku powodzenia
    }

    public static int zapiszPremieDoBazy(Connection con, Premia premiaDoZapisu) {

        if (!Utility.canBeAPesel(premiaDoZapisu.getPesel())) {
            System.out.println("Blad w zapisie sprzetu: niepoprawny pesel wlasciciela wpisu");
            return 2;
        }
        try {

            String query = " insert into Premia(id, nazwaPracy, suma, powod, decyzjaDyrektora, rozpatrzenie, pesel)"
                    + " values (?, ?, ?, ?, ?, ?, ?)";
            premiaDoZapisu.setId(okreslIdPremia(con));

            PreparedStatement preparedStmt = con.prepareStatement(query);
            preparedStmt.setInt(1, premiaDoZapisu.getId());
            preparedStmt.setString(2, premiaDoZapisu.getNazwaPracy());
            preparedStmt.setString(3, premiaDoZapisu.getSuma());
            preparedStmt.setString(4, premiaDoZapisu.getPowod());
            preparedStmt.setString(5, premiaDoZapisu.getDecyzjaDyrektora());
            preparedStmt.setString(6, premiaDoZapisu.getRozpatrzenie());
            preparedStmt.setString(7, premiaDoZapisu.getPesel());

            preparedStmt.execute();

            System.out.println("zapis premii wyglada na poprawnie przeprowadzony");
        } catch (Exception e) {
            System.err.println("Got an exception!");
            System.err.println(e.getMessage());
            return 1;                           //1 w przypadku niepowodzenia
        }
        return 0;   // 0  w przypadku powodzenia
    }

    public static int zapiszZlecenieDoBazy(Connection con, Zlecenie zlecenieDoZapisu) {

        try {

            String query = " insert into Zlecenie(id, nazwaZlecenia, opis, dataRozpoczecia, dataZakonczenia, doZaplaty, pobrano, dataPlatnosci, idKlient)"
                    + " values (?, ?, ?, ?, ?, ?, ?, ?, ?)";
            zlecenieDoZapisu.setId(okreslIdZlecenia(con));

            PreparedStatement preparedStmt = con.prepareStatement(query);
            preparedStmt.setInt(1, zlecenieDoZapisu.getId());
            preparedStmt.setString(2, zlecenieDoZapisu.getNazwaZlecenia());
            preparedStmt.setString(3, zlecenieDoZapisu.getOpis());
            preparedStmt.setString(4, zlecenieDoZapisu.getDataRozpoczeciaViaString());
            preparedStmt.setString(5, zlecenieDoZapisu.getDataZakonczeniaViaString());
            preparedStmt.setBigDecimal(6, zlecenieDoZapisu.getDoZaplaty());
            preparedStmt.setBigDecimal(7, zlecenieDoZapisu.getPobrano());
            preparedStmt.setString(8, zlecenieDoZapisu.getDataPlatnosciViaString());
            preparedStmt.setInt(9, zlecenieDoZapisu.getIdKlient());

            preparedStmt.execute();

            System.out.println("zapis zlecenia wyglada na poprawnie przeprowadzony");
        } catch (Exception e) {
            System.err.println("Got an exception!");
            System.err.println(e.getMessage());
            return 1;                           //1 w przypadku niepowodzenia
        }
        return 0;   // 0  w przypadku powodzenia
    }

}
